package com.cxb.manager;

import java.util.HashMap;

import de.greenrobot.event.EventBus;

/**
 * @author 陈伟斌 20140225
 * @category 管理Cxb的事件发布和定阅
 */
public class CxbEventBus {

	public static final String EVENT_PHONE_STATE_CHANGE = "phoneState";
	public static final String EVENT_RECEIVER_NAVIGATION = "receiver_navigation";
	public static final String EVENT_REQUEST_NAVATION = "request_navigation";
	public static final String EVENT_WEATHER_UPDATE = "weather_update";
	public static final String EVENT_MESSAGE_CHANGE = "message";
	public static final String EVENT_GSENSOR_CHANGE = "Gsensor";
	public static final String EVENT_GPS_CHANGE = "GPS";
	public static final String EVENT_GPS_RESET = "GPS_RESET";
	public static final String EVENT_PHONE_SIGAL_CHANGE = "PHONE_SIGAL_CHANGE";
	
	private static HashMap<String, EventBus> hmCxbBus = new HashMap<String, EventBus>();

	/**
	 * @author 陈伟斌
	 * @category 发布消息
	 * */
	public static void post(String tag, Object... target) {
		getCxbBus(tag).post(target);
	}

	/**
	 * @author 陈伟斌
	 * @category 注册bus, 响应函数名有四种类型： <br>
	 *           1.onEvent(Object[])：与发布同一线种. <br>
	 *           2.onEventMainThread(Object[])：事件响应函数会在Android应用的主线程 <br>
	 *           3.onEventBackgroundThread(Object[])：事件响应函数会在一个后台线程中执行 <br>
	 *           4.onEventAsync(Object[])：事件响应函数在另外一个异步线程中执行。 <br>
	 *           5.自定义方法名<br>
	 *           参数不限。
	 * @param tag
	 *            bus的标记
	 * @param target
	 *            目标类
	 * */
	public static void resgist(String tag, Object target) {
		getCxbBus(tag).register(target);
	}

	/**
	 * @author 陈伟斌
	 * @category 注册bus, 响应函数名有四种类型： <br>
	 *           1.onEvent(Object[])：与发布同一线种. <br>
	 *           2.onEventMainThread(Object[])：事件响应函数会在Android应用的主线程 <br>
	 *           3.onEventBackgroundThread(Object[])：事件响应函数会在一个后台线程中执行 <br>
	 *           4.onEventAsync(Object[])：事件响应函数在另外一个异步线程中执行。 <br>
	 *           5.自定义方法名<br>
	 * @param tag
	 *            ，bus的标记
	 * @param target
	 *            ，目标类
	 * @param name
	 *            方法名称
	 * */
	public static void resgist(String tag, Object target, String name) {
		getCxbBus(tag).register(target, name);
	}

	/**
	 * @author 陈伟斌
	 * @category 取消bus
	 * @param tag
	 *            ，bus的标记
	 * @param target
	 *            ，目标类
	 * */
	public static void unResgist(String tag, Object target) {
		getCxbBus(tag).unregister(target);
		removeBus(tag);
	}

	/**
	 * @author 陈伟斌
	 * @category 自动生成唯一的bus
	 * @param tag
	 *            bus的标记
	 * */
	public static EventBus getCxbBus(String tag) {
		if (hmCxbBus.get(tag) != null) {
			return hmCxbBus.get(tag);
		} else {
			return getInstance(tag);
		}
	}

	public static void removeBus(String tag) {
		hmCxbBus.remove(tag);
	}

	public static EventBus getInstance(String tag) {
		EventBus bus = new EventBus();
		
		hmCxbBus.put(tag, bus);
		return bus;
	}
}
